using System;
using System.ComponentModel;

namespace AW.Helper.PropertyDescriptors
{
  /// <summary>
  ///   http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces
  /// </summary>
  public abstract class ChainingPropertyDescriptor : PropertyDescriptor
  {
    private readonly PropertyDescriptor _root;

    protected PropertyDescriptor Root
    {
      get { return _root; }
    }

    protected ChainingPropertyDescriptor(PropertyDescriptor root): base(root)
    {
      _root = root;
    }

    public override void AddValueChanged(object component, EventHandler handler)
    {
      Root.AddValueChanged(component, handler);
    }

    public override AttributeCollection Attributes
    {
      get { return Root.Attributes; }
    }

    public override bool CanResetValue(object component)
    {
      return Root.CanResetValue(component);
    }

    public override string Category
    {
      get { return Root.Category; }
    }

    public override Type ComponentType
    {
      get { return Root.ComponentType; }
    }

    public override TypeConverter Converter
    {
      get { return Root.Converter; }
    }

    public override string Description
    {
      get { return Root.Description; }
    }

    public override bool DesignTimeOnly
    {
      get { return Root.DesignTimeOnly; }
    }

    public override string DisplayName
    {
      get { return Root.DisplayName; }
    }

    public override bool Equals(object obj)
    {
      return Root.Equals(obj);
    }

    public override PropertyDescriptorCollection GetChildProperties(object instance, Attribute[] filter)
    {
      return Root.GetChildProperties(instance, filter);
    }

    public override object GetEditor(Type editorBaseType)
    {
      return Root.GetEditor(editorBaseType);
    }

    public override int GetHashCode()
    {
      return Root.GetHashCode();
    }

    public override object GetValue(object component)
    {
      return Root.GetValue(component);
    }

    public override bool IsBrowsable
    {
      get { return Root.IsBrowsable; }
    }

    public override bool IsLocalizable
    {
      get { return Root.IsLocalizable; }
    }

    public override bool IsReadOnly
    {
      get { return Root.IsReadOnly; }
    }

    public override string Name
    {
      get { return Root.Name; }
    }

    public override Type PropertyType
    {
      get { return Root.PropertyType; }
    }

    public override void RemoveValueChanged(object component, EventHandler handler)
    {
      Root.RemoveValueChanged(component, handler);
    }

    public override void ResetValue(object component)
    {
      Root.ResetValue(component);
    }

    public override void SetValue(object component, object value)
    {
      Root.SetValue(component, value);
    }

    public override bool ShouldSerializeValue(object component)
    {
      return Root.ShouldSerializeValue(component);
    }

    public override bool SupportsChangeEvents
    {
      get { return Root.SupportsChangeEvents; }
    }

    public override string ToString()
    {
      return Root.ToString();
    }
  }
}